/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 周斌
 * Date: 2023-11-12
 * Time: 21:04
 */
//父类
class Animal {
    //成员变脸 属性 字段
    public String name;
    //成员方法
    public void eat() {
        System.out.println(this.name+"正在吃");
    }
    //父类有参的构造方法
    /*public Animal(String name) {
        this.name = name;
    }*/
    //父类无参的构造方法
    public Animal() {
        eat();
    }
    //以父类的类型为返回值的方法
    public Animal braks() {
        System.out.println("汪汪汪叫");
        return null;
    }
}

//子类
class Dog extends Animal {
    //子类的成员变量 属性 字段
    public String color;
    //子类的成员方法
    public void wag() {
        System.out.println("摇尾巴");
    }
//子类有参的构造方法
    /*public Dog(String name, String color) {
    super(name);
    this.color = color;
    }*/
    //子类无参的构造方法
    public Dog() {
        super();
    }
    //子类重写父类eat方法
    @Override
    public void eat() {
        System.out.println(this.name+"正在吃狗粮");
    }
    //子类重写一个以子类为返回值的braks的方法
    //父类写一个以父类类型为返回值的方法，子类也写一个以子类类型的放回值的方法，这样也构成方法重写 也称为协变类型.
    public Dog braks() {
        System.out.println("汪汪汪叫");
        return null;
    }
}

public class Test {
    //这是第二种方式传参的方法
   /* public static void fun(Animal animal) {
        animal.eat();
    }*/
    //这是第三种作为返回值的方法
    /*public static Animal func() {
        return new Dog("小黄","黄色");
    }*/
    public static void main(String[] args) {
        //实例化一个子类的对象
        //Dog dog = new Dog("小黄","黄色");
        Dog dog = new Dog();
        //向上转型
        //1.直接赋值
        //Animal animal = new Dog("小黄","黄色");
        //发生动态绑定  动态绑定是在编译之前没有确定调用父类还是子类的方法，到运行的时候调用了子类的方法
        //静态绑定是在编译的时候就确定了调用谁的方法
        //animal.eat();
        //2.传参的方式向上转型
        //fun(dog);
        //3.作为返回值的方式向上转型
        //func().eat();
        //func().braks();

    }
}
